home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 2 / CU Amiga Magazine's Super CD-ROM 02 (1996)(EMAP Images)(GB)[!][issue 1996-04].iso / magazine / amiga_e / cardlist.e < prev    next >
Text File  |  1994-04-06  |  5KB  |  158 lines

  1. MODULE 'workbench/startup', 'workbench/workbench', 'icon'
  2.  
  3. CONST MEMSTART=$600000, BLOCKSIZE=$100, FILEINFOSIZE=$20, MAGIC=$2000
  4. CONST HEADEROFF=2*BLOCKSIZE, BLKPTRSIZE=2, FILELEN=13
  5. CONST FREEOFF=HEADEROFF+BLOCKSIZE, HEADER=HEADEROFF+MEMSTART
  6. CONST FREEBLOCKS=FREEOFF+MEMSTART, EOFB=$FFFE, EOC=$FFFF, DEL=0, START=0
  7. CONST VERB_COLS=2, NOVERB_COLS=3
  8.  
  9. ENUM NO_ERR, BAD_CARD, NO_FREE, OPEN_LIB
  10.  
  11. OBJECT fileinfo
  12.   file, next
  13. ENDOBJECT
  14.  
  15. RAISE OPEN_LIB IF OpenLibrary()=NIL
  16.  
  17. /* lastinfo is a block pointer with MAGIC, e.g., $213A (not $13A) */
  18. DEF thefiles:PTR TO fileinfo, lastfile:PTR TO fileinfo, lastinfo
  19.  
  20. PROC main() HANDLE
  21.   DEF f:PTR TO fileinfo, i=0, verbose=FALSE, startup:PTR TO wbstartup,
  22.       args=FALSE, rdargs=NIL, templ, wargs:PTR TO wbarg, oldlock=NIL,
  23.       dobj:PTR TO diskobject
  24.   iconbase:=OpenLibrary('icon.library', 33)
  25.   IF startup:=wbmessage
  26.     IF startup.numargs>=1
  27.       wargs:=startup.arglist
  28.       IF wargs.lock THEN oldlock:=CurrentDir(wargs.lock)
  29.       IF wargs.name
  30.         IF dobj:=GetDiskObject(wargs.name)
  31.           verbose:=FindToolType(dobj.tooltypes, 'VERBOSE')
  32.           FreeDiskObject(dobj)
  33.         ENDIF
  34.       ENDIF
  35.       IF oldlock THEN CurrentDir(oldlock)
  36.     ENDIF
  37.   ELSE
  38.     templ:='V=VERBOSE/S'
  39.     rdargs:=ReadArgs(templ,{args},NIL)
  40.     IF rdargs THEN verbose:=args
  41.   ENDIF
  42.   getinfo()
  43.   f:=thefiles.next
  44.   WHILE f
  45.     printfile(f.file, {i}, verbose)
  46.     f:=f.next
  47.   ENDWHILE
  48.   printfile(NIL, {i}, verbose)  /* Trailing linefeed? */
  49.   Raise(NO_ERR)
  50. EXCEPT
  51.   IF rdargs THEN FreeArgs(rdargs)
  52.   IF iconbase THEN CloseLibrary(iconbase)
  53.   SELECT exception
  54.   CASE OPEN_LIB
  55.     WriteF('Could not open icon library\n')
  56.   CASE BAD_CARD
  57.     WriteF('No PCMCIA card, or not from Notepad\n')
  58.   CASE NO_FREE
  59.     WriteF('No more free blocks -- card is full\n')
  60.   ENDSELECT
  61. ENDPROC
  62.  
  63. PROC printfile(file, count, verbose)
  64.   IF file
  65.     IF deleted(file)=FALSE
  66.       ^count:=^count+1
  67.       IF verbose
  68.         WriteF('\l\s[12]  \r\d[5]', filename(file), filesize(file))
  69.         printdate(file)
  70.         WriteF(IF Mod(^count, VERB_COLS)=0 THEN '\n' ELSE '   ')
  71.       ELSE
  72.         WriteF('\l\s[12]  \r\d[5]\s', filename(file), filesize(file),
  73.                IF Mod(^count, NOVERB_COLS)=0 THEN '\n' ELSE '   ')
  74.       ENDIF
  75.     ENDIF
  76.   ELSE
  77.     IF Mod(^count, IF verbose THEN VERB_COLS ELSE NOVERB_COLS)<>0
  78.       WriteF('\n')
  79.     ENDIF
  80.   ENDIF
  81. ENDPROC
  82.  
  83. PROC printdate(file)
  84.   DEF date, year, month, day, hour, min
  85.   date:=filedate(file)
  86.   year:=Mod(90+Shr(date, 25), 100)
  87.   month:=Shr(date AND $1FFFFFF, 21)
  88.   IF (month>12) OR (month<1) THEN month:=0
  89.   day:=Shr(date AND $1FFFFF, 16)
  90.   hour:=Shr(date AND $FFFF, 11)
  91.   min:=Shr(date AND $7FF, 5)
  92.   WriteF(' \r\d[2]-\s-\z\d[2] \r\d[2]:\z\d[2]', day,
  93.          ListItem(['XXX', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul',
  94.                    'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], month),
  95.          year, hour, min)
  96. ENDPROC
  97.  
  98. PROC getinfo()
  99.   DEF info, nofiles=FALSE, atend=FALSE, file
  100.   file:=HEADER
  101.   lastinfo:=firstblock(file)
  102.   thefiles:=lastfile:=newfile(file)
  103.   IF validate(file)
  104.     file:=file+FILEINFOSIZE
  105.     REPEAT   /* for all info blocks */
  106.       REPEAT /* for all files */
  107.         IF blank(file)
  108.           nofiles:=TRUE
  109.         ELSE
  110.           lastfile.next:=newfile(file)
  111.           lastfile:=lastfile.next
  112.           file:=file+FILEINFOSIZE
  113.           IF Mod(file, BLOCKSIZE)=0 THEN atend:=TRUE
  114.         ENDIF
  115.       UNTIL atend OR nofiles
  116.       IF atend
  117.         info:=follow(lastinfo)
  118.     IF (info<>EOC) AND (info<>DEL)
  119.           lastinfo:=info
  120.           file:=address(lastinfo)
  121.           atend:=FALSE
  122.         ELSE
  123.           nofiles:=TRUE
  124.         ENDIF
  125.       ENDIF
  126.     UNTIL nofiles
  127.   ELSE
  128.     Raise(BAD_CARD)
  129.   ENDIF
  130. ENDPROC
  131.  
  132. PROC follow(block) RETURN int(blockaddr(block))
  133. PROC blockaddr(block) RETURN (block-MAGIC)*BLKPTRSIZE+FREEBLOCKS
  134. PROC address(block) RETURN (block-MAGIC)*BLOCKSIZE+MEMSTART
  135.  
  136. PROC validate(file)
  137.   RETURN StrCmp(filename(file), 'NC', 2) AND
  138.         (firstblock(file)=HEADEROFF+MAGIC)
  139. ENDPROC
  140.  
  141. PROC blank(file)
  142.   DEF n
  143.   FOR n:=0 TO FILEINFOSIZE-1 DO IF file[]++<>0 THEN RETURN FALSE
  144. ENDPROC TRUE
  145.  
  146. PROC filename(file) RETURN file
  147. PROC filesize(file) RETURN int(file+14)
  148. PROC filedate(file) RETURN long(file+16)
  149. PROC firstblock(file) RETURN int(file+20)
  150. PROC deleted(file) RETURN file[]=0
  151. PROC int(p) RETURN p[]++ OR Shl(p[],8)
  152. PROC long(p) RETURN p[]++ OR Shl(p[]++,8) OR Shl(p[]++,16) OR Shl(p[],24)
  153.  
  154. PROC newfile(ptr)
  155.   DEF p
  156.   CopyMem([ptr, NIL]:fileinfo, p:=New(SIZEOF fileinfo), SIZEOF fileinfo)
  157. ENDPROC p
  158.